/*
 * atributo.java
 *
 * Created on 5 de Maio de 2007, 20:56
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor. 
 */

package org.jerm.Mapeamento.Atributos;
import java.util.ArrayList;
import java.lang.Exception;

/**
 *Classe de Atributos do tipo Text. 
 *
 *<BR>Possui: 
 * Nome, 
 * Tipo, 
 * Unico, 
 * Padrao. 
 * 
 *<BR>Implementa: 
 * Nulo, 
 * CharSet, 
 * Collate. 
 *
 *@author Tiago Falcao
 *@version 1.0b 15/05/07
 */
public class AtributoTexto extends AtributoBoolean{
    /**
     * Tipo de Codificacao dos Caracteres, CharSet
     */
    protected String CharSet;        //Se Atributo nao pode repetido
    /**
     * Implementacao da Codificacao dos Caracteres, Collate
     */
    protected String Collate;        //Se Atributo nao pode repetido
    /**
     * Boolean que determina se Atributo pode ou n�o ser nulo
     * true=Atributo pode ser nulo
     * false=Atributo n�o pode ser nulo
     */
    protected boolean Nulo;        //Se Atributo nao pode repetido
    
    /**
     * Cria nova instancia de Atributo Texto
     */
    public AtributoTexto()
    {
        super();
        this.Nulo=true;
        this.CharSet=new String();
        this.Collate=new String();
    }
    
    public void loadArray(Object[] o){
        if(o.length!=13)
            return;
        Nome=(String)o[0];
        Tipo=(String)o[1];
        Unico=((Boolean)o[2]).booleanValue();
        Padrao=(String)o[3];
        Nulo=((Boolean)o[4]).booleanValue();
        CharSet=(String)o[9];
        Collate=(String)o[10];
        MultiValorado=((Boolean)o[12]).booleanValue();
        
    }
    
    public Object[] getArray(){
        Object[] o=new Object[13];
        o[0]=Nome;
        o[1]=Tipo;
        o[2]=new Boolean(Unico);
        o[3]=Padrao;
        o[4]=new Boolean(Nulo);
        o[5]=new Boolean(false);
        o[6]=new Boolean(false);
        o[7]=new Integer(0);
        o[8]=new Integer(0);
        o[9]=CharSet;
        o[10]=Collate;
        o[11]=new String();
        o[12]=new Boolean(MultiValorado);
        return o;
    }
    
    
    /**
     * Atribui Valor de Nulo do Atributo
     * @param Nulo Boolean que determina se Atributo pode ou n�o ser nulo
     * @throws java.lang.Exception Nunca
     */
    public void setNulo(boolean Nulo)
    {
        if(this.Padrao.equals ("NULL"))
            this.Padrao="";
        this.Nulo=Nulo;
    }
    
    /**
     * Atribui o Tipo ao Atributo
     * @param Tipo Tipo do atributo
     * @throws java.lang.Exception Se Tipo for diferente de Text
     */
    public void setTipo(String Tipo) throws Exception
    {
        Tipo=Tipo.toLowerCase ();
        if((! Tipo.equals ("text")))
            throw new java.lang.Exception("Este e Atributo somente de Texto");
        this.Tipo=Tipo;
    }
    
    /**
     * Atribui o CharSet do Atributo
     * @param CharSet Nome do CharSet do Atributo
     * @throws java.lang.Exception Nunca
     */
    public void setCharSet(String CharSet)
    {
        this.CharSet=CharSet.toLowerCase ();
    }
    
    /**
     * Atribui o Collate do Atributo
     * @param Collate Nome do Collate do Atributo
     * @throws java.lang.Exception Nunca
     */
    public void setCollate(String Collate)
    {
        this.Collate=Collate.toLowerCase ();
    }
    
    /**
     * Atribui Valor Padrao ao atributo
     * @param Padrao Valor Padrao do atributo ('','0', 'true', ...)
     * @throws java.lang.Exception Se Padrao for NULL para um Atributo Nulo=false
     */
    public void setPadrao(String Padrao) throws Exception
    {
        Padrao=Padrao.toUpperCase ();
        if(Padrao.equals ("NULL") && (! this.Nulo))
            throw new java.lang.Exception("Padrao Invalido para um Atributo NOT NULL");
        this.Padrao=Padrao;
    }
    
    public boolean getNulo(){
        return Nulo;
    }
    
    /**
     * Retorna Nulo formatado para o SGBD
     * @param SGBD Nome do SGBD a ser Utilizado
     * @return String formatada para o SGBD
     * @throws java.lang.Exception Nunca
     */
    protected String getNuloSQL(String SGBD)
    {
        if(! this.Nulo)
            return "NOT NULL";
        else if(this.Padrao.length ()==0)
            return "default NULL";
        else
            return "";
    }
    
    /**
     * Retorna CharSet formatado para o SGBD
     * @param SGBD Nome do SGBD a ser Utilizado
     * @return String formatada para o SGBD
     * @throws java.lang.Exception Nunca
     */
    protected String getCharSetSQL(String SGBD) throws Exception
    {
        if(this.CharSet.length ()==0)
            return "";
        return "CHARACTER SET "+this.CharSet;
    }
    
    /**
     * Retorna Collate formatado para o SGBD
     * @param SGBD Nome do SGBD a ser Utilizado
     * @return String formatada para o SGBD
     * @throws java.lang.Exception Nunca
     */
    protected String getCollateSQL(String SGBD) throws Exception
    {
        if(this.Collate.length ()==0)
            return "";
        return "COLLATE "+this.Collate;
    }

    
    /**
     * Retorna parte do SQL para criacao do Atributo para o SGBD especificado, 
     * sem o Nome do Atributo.
     * @param SGBD Nome do SGBD para o qual sera gerado o SQL
     * @return String SQL para cofiguracao do Atributo
     * @throws java.lang.Exception Se Atributo n�o possuir Nome ou Tipo, ou Padrao==NULL para Atributo NOT NULL
     */
    public String getInfoSQL(String SGBD) throws Exception
    {
        String Temp;
        String Retorno;

        // Nome e Tipo
        Retorno="\t"+this.getTipoSQL (SGBD);
        
        Temp=this.getCharSetSQL (SGBD);
        if(Temp.length ()>0)
            Retorno+="\t"+Temp;
        
        Temp=this.getCollateSQL (SGBD);
        if(Temp.length ()>0)
            Retorno+="\t"+Temp;
        
        Temp=this.getPadraoSQL (SGBD);
        if(Temp.length ()>0)
            Retorno+="\t"+Temp;
        
        Temp=this.getUnicoSQL (SGBD);
        if(Temp.length ()>0)
            Retorno+="\t"+Temp;    

        return Retorno;
        
    }
    
}